package slxy.jiangtao.dts.core.util;

import org.apache.commons.beanutils.BeanUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

public class ListUtils {

  /**
   * 按新的Class对象复制
   *
   * @param source list, example: list
   * @param destinationClass class, example: UserEntity.class;
   */
  public static <E> List<E> copyTo(List<?> source, Class<E> destinationClass) throws Exception {
    if (source.size() == 0) return new ArrayList();
    List<E> res = new ArrayList<E>(source.size());
    for (Object o : source) {
      E e = destinationClass.newInstance();
      BeanUtils.copyProperties(e, o);
      res.add(e);
    }
    return res;
  }

  public static boolean isNullOrEmpty(List list) {
    return list == null || list.isEmpty();
  }

  /**
   * 根据指定属性对集合顺序排序
   * @param data 集合对象
   * @param func 委托
   * @param <T> 数据类型
   * @param <R> 要排序的属性的数据类型
   */
  public static <T, R extends Comparable<? super R>> void sort(List<T> data, Function<T, R> func){
    Comparator<T> comparator = Comparator.comparing(func);
    data.sort(comparator);
  }

  /**
   * 根据指定属性对集合倒序排序
   * @param data 集合对象
   * @param func 委托
   * @param <T> 数据类型
   * @param <R> 要排序的属性的数据类型
   */
  public static <T, R extends Comparable<? super R>> void sortDescending(List<T> data, Function<T, R> func){
    Comparator<T> comparator = Comparator.comparing(func).reversed();
    data.sort(comparator);
  }
}
